home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / lpr10.zip / LPRM.C < prev    next >
C/C++ Source or Header  |  1992-11-08  |  4KB  |  169 lines

  1. /*
  2.  * lpr.c - Windows NT lpr
  3.  *
  4.  * by Eric W. Brown
  5.  *    3 November '92
  6.  */
  7. #include <windows.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <winsock.h>
  12. #include "lp.h"
  13.  
  14. #define ARGS_LEN 512
  15. #define DEFAULT_INTERVAL 5
  16. #define USERNAME_LEN 64
  17. #define HOSTNAME_LEN 64
  18.  
  19. int usage()
  20. {
  21.     fprintf(stderr, "Usage: lprm [-Pprinter] [-Sserver] [-] [job# ...]\n");
  22.     exit(1);
  23.     return 0;
  24. } /* usage() */
  25.  
  26. void main(int argc, char **argv)
  27. {
  28.     int     sockfd = 0;
  29.     char    *printer = NULL;
  30.     char    *server = NULL;
  31.     char    hostname[HOSTNAME_LEN];
  32.     char    username[USERNAME_LEN];
  33.     char    args[ARGS_LEN + 1] = "";
  34.     int        args_len = 0;
  35.     char    request[ARGS_LEN + 128];
  36.     int        interval = 0;
  37.     char    buf[133];
  38.     int        len;
  39.     
  40.     /*
  41.      * Get environment variables
  42.      */
  43.     server = getenv("SERVER");
  44.     printer = getenv("PRINTER");
  45.     if (!printer) 
  46.         printer = DEFAULT_PRINTER;
  47.  
  48.     len = HOSTNAME_LEN;
  49.     if (!GetComputerName(hostname, &len) || len == 0) {
  50.         fprintf(stderr, "lprm: No hostname, name your computer!!!\n");
  51.         exit(1);
  52.     } /* if */
  53.     
  54.     len = USERNAME_LEN;
  55.     if (!GetUserName(username, &len))
  56.         strncpy(username, hostname, USERNAME_LEN);
  57.     
  58.     /*
  59.      * Parse command line
  60.      */
  61. #define NEXT_ARG()  (argc--, argv++, argc ? *argv : (char *)(usage(), NULL))
  62. #define ARG_ARG()   (strlen(*argv) == 2 ? NEXT_ARG() : (*argv) + 2)
  63.     while (argc > 1) {
  64.         NEXT_ARG();
  65.         if ((*argv[0] == '-' || *argv[0] == '/') && strlen(*argv) > 1) {
  66.             switch(argv[0][1]) {
  67.             case 'P':
  68.                 printer = ARG_ARG();
  69.                 break;
  70.             case 'S':
  71.                 server = ARG_ARG();
  72.                 break;
  73.             case 'U':    /* Impersonate a user! */
  74.                 strncpy(username, ARG_ARG(), USERNAME_LEN);
  75.                 break;
  76.             default:
  77.                 fprintf(stderr, "lprm: %s: Invalid option\n", *argv);
  78.                 usage();
  79.             } /* switch */
  80.         }
  81.         else if (*argv[0] == '-') {
  82.             args_len += strlen(username) + 1;
  83.             if (args_len > ARGS_LEN) {
  84.                 fprintf(stderr, "lprm: Command line too long!\n");
  85.                 exit(1);
  86.             } /* if */
  87.             strcat(args, " ");
  88.             strcat(args, username);
  89.         }
  90.         else {
  91.             args_len += strlen(*argv) + 1;
  92.             if (args_len > ARGS_LEN) {
  93.                 fprintf(stderr, "lprm: Command line too long!\n");
  94.                 exit(1);
  95.             } /* if */
  96.             strcat(args, " ");
  97.             strcat(args, *argv);
  98.         } /* else */
  99.     } /* while argc */
  100.         
  101.     
  102.     /*
  103.      * Do a lookup in the printcap file if necessary
  104.      */
  105.     if (!server)
  106.         if (!(server = lp_printcap_server_lookup(printer))) {
  107.             fprintf(stderr, "No server, %s, and no printer, %s, in printcap file!\n", 
  108.                     server, printer);
  109.             usage();
  110.         } /* if */
  111.     
  112.     
  113.     /*
  114.      * Initialize tcp
  115.      */
  116.     if (lp_tcp_startup()) {
  117.         fprintf(stderr, "lprm: Couldn't initalize tcp/ip\n");
  118.         exit(1);
  119.     } /* if */
  120.     
  121.     
  122.     /*
  123.      * Open socket
  124.      */
  125.     if ((sockfd = lp_tcp_open(server)) < 0) {
  126.         lp_tcp_shutdown();
  127.         fprintf(stderr, "lprm: Couldn't open connection to %s\n", server);
  128.         exit(1);
  129.     } /* if */
  130.     
  131.     
  132.     /*
  133.      * Build request
  134.      */
  135.     sprintf(request, "%c%s %s%s\n", LPD_REMOVE_JOB, printer, username, args);
  136.  
  137.  
  138.     /*
  139.      * Send request
  140.      */
  141.     if (send(sockfd, request, strlen(request), 0) != (int)strlen(request)) {
  142.         closesocket(sockfd);
  143.         lp_tcp_shutdown();
  144.         fprintf(stderr, "lprm: Error making request\n");
  145.         exit(1);
  146.     } /* if */
  147.     
  148.     
  149.     /*
  150.      * Print output
  151.      */
  152.     while(1) {
  153.         memset((void *)buf, 0, 133);
  154.         len = recv(sockfd, buf, 132, 0);
  155.         if (len <= 0)
  156.             break;
  157.         printf("%s", buf);
  158.     } /* while */
  159.     
  160.     /*
  161.      * Clean up
  162.      */
  163.     closesocket(sockfd);
  164.     lp_tcp_shutdown();
  165.     exit(0);
  166. } /* main() */
  167.  
  168.  
  169.